/**
 ******************************************************************************
 * @file	epcsx.h
 * @brief	epcsx 存储器通信

驱动层采用 spidev 控制器驱动依赖 spi_mxs，该驱动忽略 cs_change，
每一个spi_ioc_transfer里的所有内容均不在似 cs 信号翻转，翻转只存在于末尾

bug
    连续write、read数小时驱动存在错误，大概374行

 * @section Depend
 *	-# spi_mxs.ko
 *	-# spidev.ko

- 2016-10-18,MenglongWu,MenglongWoo@aliyun.com
*/


#ifndef _EPCSX_H_
#define _EPCSX_H_

/** @defgroup epcsx
 * @{
 */
struct epcs_dev
{
    int           fd;
    char          pid;
    char	 *desc;
    unsigned long num_sector;
    unsigned long page_per_sector;
    unsigned long byte_per_page;
    unsigned long sector_sz;
};


// int  epcs_close(struct epcs_dev *dev);;
// int epcs_open(char *device, struct epcs_dev **dev, unsigned long ispeed);;
// int epcs_erase_bulk(struct epcs_dev *dev);;
// void epcs_erase_sector(struct epcs_dev *dev, unsigned int addr);;
// int epcs_write_page(struct epcs_dev *dev, unsigned int addr, unsigned char *data, unsigned int len);;
// int epcs_read_page(struct epcs_dev *dev, unsigned int addr, unsigned char *data, unsigned int len);;
// unsigned int epcs_size(struct epcs_dev *dev);;

/** @defgroup epcsx导出接口
 * @{
 */

/**
 * @brief	关闭已打开的otdr采集卡
 * @param[in]	dev 设备描述符
 * @retval	null
 * @see epcs_open
 */
int epcs_close(struct epcs_dev *dev);
/**
 * @brief	打开EPCSx SPI设备
 * @param[in]	device 设备节点
 * @param[out]	dev 设备描述符
 * @param[in]	ispeed 指定通信速率，传递0时采用默认500KHz
 * @retval	0  成功 dev返回有效值
 * @retval	-1 设备节点打开失败
 * @retval	-2 设备打开成功，但检测不到 epcsx
 * @see epcs_close
 */
int epcs_open(char *device, struct epcs_dev **dev, unsigned long ispeed);

/**
 * @brief	擦除整块存储器
 * @param[in]	dev 设备描述
 * @retval	0 正常擦除
 * @retval	-1 设备异常
 * @remarks	擦除后有一段挺长的时间不能进行读写操作，epcs4是5秒，可以通过
 * epcs_read_status 检查是否完成擦除
 * @see	epcs_read_status epcs_erase_sector
 */

int epcs_erase_bulk(struct epcs_dev *dev);
/**
 * @brief	只擦除一页
 * @param[in]	dev 设备描述
 * @param[in]	addr 擦除页的首地址
 * @retval	0 正常擦除
 * @retval	-1 设备异常
 * @remarks	擦除后设备短暂时间不能读写、可以通过
 * epcs_read_status 检查是否完成擦除
 * @see	epcs_read_status epcs_erase_sector
 */
int epcs_erase_sector(struct epcs_dev *dev, unsigned int addr);
/**
 * @brief	写入一页内容
 * @param[in]	dev 设备描述
 * @param[in]	addr 页地址
 * @param[in]	data 数据
 * @param[in]	len 数据长度
 * @retval	0 正常写入
 * @retval	-1 异常
 * @remarks	写入页面时必须将页面先擦除
 * @see	epcs_erase_sector
 * @see	epcs_read_page
 */

int epcs_write_page(struct epcs_dev *dev, unsigned int addr, unsigned char *data, unsigned int len);
/**
 * @brief	读取一页内容
 * @param[in]	dev 设备描述
 * @param[in]	addr 页地址
 * @param[in]	data 数据
 * @param[in]	len 数据长度
 * @retval	0 正常写入
 * @retval	-1 异常
 * @see	epcs_write_page
 */
int epcs_read_page(struct epcs_dev *dev, unsigned int addr, unsigned char *data, unsigned int len);
/**
 * @brief	获取存储器容量已byte为单位
 * @param[in]	dev 设备描述
 * @retval	返回容量
 */

unsigned int epcs_size(struct epcs_dev *dev);

/** end epcsx导出接口
 * @}
 */

/** end epcsx
 * @}
 */
#endif
